package com.tao.innerclass;

public class AnonymousInnerClassDetail {
    public static void main(String[] args) {
        Outer03 outer03 = new Outer03();
        outer03.f1();
    }
}

class Outer03{
    private int n1 = 55;
    public void f1(){
        //匿名内部类有两种定义方式
        Person person = new Person(){//第一种
            private int n1 = 66;
            @Override
            public void hi() {
                //可以直接访问外部类的所有成员，包含私有的
                //如果外部类和匿名内部类的成员重名，匿名内部类访问默认遵循就近原则，和局部内部类一样规则
                System.out.println("匿名内部类重写了 hi 方法 n1=" + n1 +
                        " 外部内的 n1=" + Outer03.this.n1);
                super.hi();
            }
        };
        person.hi();

        //可以直接调用, 匿名内部类本身也是返回对象
        new Person(){//第二种
            @Override
            public void hi() {
                System.out.println("匿名内部类重写了 hi 方法,哈哈...");
                super.hi();
            }

            @Override
            public void ok(String str) {
                super.ok(str);
            }
        }.hi();
    }
}

class Person{
    public void hi(){
        System.out.println("Person hi()");
    }

    public void ok(String str) {
        System.out.println("Person ok()" + str);
    }
}